home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / tcp / ATCP_sdk_40_gc.lha / AmiTCP-4.0-gcc / doc / usergroup.doc < prev   
Text File  |  1994-10-15  |  45KB  |  1,321 lines

  1. TABLE OF CONTENTS
  2.  
  3. usergroup.library/--background--
  4. usergroup.library/--Licence--
  5. usergroup.library/crypt
  6. usergroup.library/getcredentials
  7. usergroup.library/getgrent
  8. usergroup.library/getgroups
  9. usergroup.library/getlastlog
  10. usergroup.library/getlogin
  11. usergroup.library/getpass
  12. usergroup.library/getpwent
  13. usergroup.library/getspgrp
  14. usergroup.library/getuid
  15. usergroup.library/getumask
  16. usergroup.library/getutent
  17. usergroup.library/initgroups
  18. usergroup.library/MU2UG
  19. usergroup.library/setgroups
  20. usergroup.library/setlastlog
  21. usergroup.library/setlogin
  22. usergroup.library/setsid
  23. usergroup.library/setuid
  24. usergroup.library/ug_GetConsoleName
  25. usergroup.library/ug_GetErr
  26. usergroup.library/ug_GetSalt
  27. usergroup.library/ug_OnConsole
  28. usergroup.library/ug_SetupContextTags
  29. usergroup.library/ug_StrError
  30. usergroup.library/umask
  31. usergroup.library/--background--             usergroup.library/--background--
  32.  
  33.    WARNING
  34.        Unfortunately, this experimental release of usergroup.library is not
  35.        compatible with multiuser.library.  There are some problems with
  36.        multiuser.library, eg. the multiuser.library does not support the
  37.        real ids.  Also the password format is different, multiuser.library
  38.        uses the AS225r2 password format, which is very simple encoding.
  39.        The usergroup.library uses the standard Unix password encryption.
  40.  
  41.        The current implementation of this model is very simple.  All tasks
  42.        belong to one session and they share common credentials.  The
  43.        setsid() function call does nothing.  You are supposed to log in
  44.        using "login -f login-name" when the machine is booted.
  45.  
  46.    PURPOSE
  47.        When the AmiTCP/IP was originally released, a little attention was
  48.        paid to the security aspects.  Since the AmigaOS is basically a
  49.        single user operating system with little or no provisions for
  50.        multiple users, there was no standard how accounts, password
  51.        checking and access control should be implemented.
  52.  
  53.    USERGROUP.LIBRARAY SEMANTICS
  54.        The usergroup.library provides a BSD-stylish interface to the user
  55.        and group identification, the account database, the group databases,
  56.        password checking and login information.  Since it is a shared
  57.        library instead of link library, the underlying security mechanisms
  58.        can be changed according future standards and needs.  The
  59.        usergroup.library provides quite clean basic model. Each process has
  60.        credentials, which consist of real used ID, real group ID, effective
  61.        user ID and up to 32 effective group IDs. The process credentials
  62.        can be changed with setuid()/setgid()/setgroups() functions.
  63.  
  64.        Each process belongs also to an session.  A new session will created
  65.        with setsid() function call, which is typically executed before you
  66.        call command or when you create a new connection.  A session
  67.        contains the login name of the user and possibly some other
  68.        information.
  69.  
  70.        The information about users logging in and out is typically stored
  71.        into a file in Unix systems.  These files (in BSD Net2 release they
  72.        are /var/run/utmp and /var/log/wtmp) are usually very long and
  73.        contain holes.  Since the AmigaDOS files cannot contain holes, this
  74.        approach is not practical.  The usergroup.library provides an
  75.        loosely HP-UX-stylish interface to the utmp and lastlogin databases.
  76.        The utmp database contains an entry for each session, it is searched
  77.        in linear manner qith getutent().  The lastlogin database contains
  78.        an entry for each user and getlastlogin() returns an entry for given
  79.        UID.
  80.  
  81.        The usergroup.library does not directly depend on AmiTCP/IP.  It can
  82.        be used with any program needing user identification, account and
  83.        group databases.
  84.        
  85.    USING USERGROUP.LIBRARY
  86.        Each time the usergroup.library is opened, it creates an new
  87.        instance of the library base.  The library base contains the static
  88.        data buffers used by many library functions.  The usergroup.library
  89.        functions behave exactly like they were in link library. The
  90.        functions allocate all resources for you, the library also frees the
  91.        resources when they are no more needed.
  92.  
  93.        Since each library contains static data and resources allocated in
  94.        the context of calling task (ie. signals), only the task which
  95.        opened the library is allowed to call most library functions.
  96.        However, any task whatsoever can call following functions:
  97.  
  98.            getuid() geteuid() getgid() getegid() getsid()
  99.  
  100.        These functions return the credentials of calling task.
  101.  
  102.        It is also possible to call following functions from any task.
  103.        However, note that a non-owning tasks cannot recover error codes:
  104.  
  105.            getgroups() setreuid() setuid() setregid() setgid() setgroups() 
  106.            setsid() setlogin() 
  107.  
  108.        It is possible to give the library instance to another task.  Only
  109.        the current owner can close the library.
  110.  
  111.        The user and group information is provided by netinfo.device.
  112.        It is more convenient interface to user and group databases
  113.        for multitasking applications.
  114.  
  115.    EXAMPLE PROGRAMS
  116.        There are a few utilities provided as examples.  The finger programs
  117.        deals with user (password), utmp and lastlog database, the id and
  118.        whoami with user and group identification, login and passwd with
  119.        password checking and password changing.
  120.  
  121.    SEE ALSO
  122.        netinfo.device/--background--, ug_SetupContextTags(),
  123.        SAS C Manual, libinit.c and libinitr.o
  124.  
  125.    COPYRIGHT
  126.        Copyright © 1980--1991 The Regents of the University of California.
  127.        Copyright © 1993, 1994 AmiTCP/IP Group,
  128.        Network Solutions Development Inc., Finland.
  129.  
  130. usergroup.library/--Licence--                   usergroup.library/--Licence--
  131.  
  132.   USERGROUP.LIBRARY LICENCE
  133.        The usergroup.library is Copyright © 1993, 1994 AmiTCP/IP Group,
  134.        Network Solutions Development Inc., Finland.
  135.  
  136.        The usergroup.library contains source code from 4.3BSD Net2 release.
  137.        The 4.3BSD Net2 release is copyright © 1980 --- 1991 The Regents of
  138.        the University of California.  The following licence apply to the
  139.        usergroup.library and its documentation:
  140.  
  141.        Redistribution and use in source and binary forms, with or without
  142.        modification, are permitted provided that the following conditions
  143.        are met:
  144.  
  145.        1. Redistributions of source code must retain the above copyright
  146.           notice, this list of conditions and the following disclaimer.
  147.        2. Redistributions in binary form must reproduce the above copyright
  148.           notice, this list of conditions and the following disclaimer in
  149.           the documentation and/or other materials provided with the
  150.           distribution.
  151.        3. All advertising materials mentioning features or use of this
  152.           software must display the following acknowledgement: This product
  153.           includes software developed by the University of California,
  154.           Berkeley and its contributors.
  155.        4. Neither the name of the University nor the names of its
  156.           contributors may be used to endorse or promote products derived
  157.           from this software without specific prior written permission.
  158.  
  159.        THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
  160.        AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  161.        TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  162.        PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
  163.        CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  164.        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  165.        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  166.        USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  167.        ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  168.        OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  169.        OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  170.        SUCH DAMAGE.
  171.  
  172. usergroup.library/crypt                               usergroup.library/crypt
  173.  
  174.    NAME
  175.        crypt - password encryption with DES
  176.  
  177.    SYNOPSIS
  178.       result = crypt(key, setting);
  179.         D0           A0     A1
  180.  
  181.       char *crypt(const char *, const char *)
  182.  
  183.    FUNCTION
  184.        The crypt function performs password encryption.  It is derived from
  185.        the NBS Data Encryption Standard.  Additional code has been added to
  186.        deter key search attempts.  
  187.  
  188.    INPUTS
  189.        key - a NUL-terminated string (normally a password typed by a user).
  190.  
  191.        setting - a character array, 9 bytes in length, consisting of an
  192.                  underscore (`_') followed by 4 bytes of iteration count
  193.                  and 4 bytes of salt.  Both the iteration count and the
  194.                  salt are encoded with 6 bits per character, least
  195.                  significant bits first.  The values 0 to 63 are encoded by
  196.                  the characters `./0-9A-Za-z', respectively.
  197.  
  198.        The salt is used to induce disorder in to the DES algorithm in one
  199.        of 16777216 possible ways (specifically, if bit i of the salt is set
  200.        then bits i and i+24 are swapped in the DES `E' box output).  The
  201.        key is divided into groups of 8 characters (a short final group is
  202.        null-padded) and the low-order 7 bits of each each character (56
  203.        bits per group) are used to form the DES key as follows: the first
  204.        group of 56 bits becomes the initial DES key.  For each additional
  205.        group, the XOR of the group bits and the encryption of the DES key
  206.        with itself becomes the next DES key.  Then the final DES key is
  207.        used to perform count cumulative encryptions of a 64-bit constant.
  208.  
  209.    RESULTS
  210.        result - a NUL-terminated string, 20 bytes in length, consisting of
  211.                 the setting followed by the encoded 64-bit encryption.
  212.  
  213.    NOTE
  214.        For compatibility with Version 7 UNIX version of crypt(), the
  215.        setting may consist of 2 bytes of salt, encoded as above, in which
  216.        case an iteration count of 25 is used, fewer perturbations of DES
  217.        are available, at most 8 characters of key are used, and the
  218.        returned value is a NUL-terminated string 13 bytes in length.
  219.  
  220.    HISTORY
  221.        A rotor-based crypt() function appeared in Version 6 AT&T UNIX.  The
  222.        current style crypt() first appeared in Version 7 AT&T UNIX.
  223.  
  224.    BUGS
  225.        The crypt() function leaves its result in an internal static object
  226.        and returns a pointer to that object.  Subsequent calls to crypt()
  227.        will modify the same object.
  228.  
  229.    SEE ALSO
  230.        netutil/login, netutil/passwd, getpass(), netinfo.device/passwd
  231.  
  232.        Wayne Patterson, Mathematical Cryptology for Computer Scientists and
  233.        Mathematicians, ISBN 0-8476-7438-X, 1987.
  234.  
  235.        R. Morris, and Ken Thompson, "Password Security: A Case History",
  236.        Communications of the ACM, vol. 22, pp. 594-597, Nov. 1979.
  237.  
  238.        M.E. Hellman, "DES will be Totally Insecure within Ten Years", IEEE
  239.        Spectrum, vol. 16, pp. 32-39, July 1979.
  240.  
  241. usergroup.library/getcredentials             usergroup.library/getcredentials
  242.  
  243.    NAME
  244.        getcredentials -- get credentials of given task. (V4)
  245.  
  246.    SYNOPSIS
  247.        #include <libraries/usergroup.h>
  248.  
  249.        credentials = getcredentials(task)
  250.        D0                              A0
  251.  
  252.        struct UserGroupCredentials *getcredentials(struct Task *);
  253.  
  254.    FUNCTION
  255.        The function getcredentials() returns all credentials of the given
  256.        task.  The credentials include real and effective user and group IDs,
  257.        umask, login name and session ID.  If the task pointer is NULL, the
  258.        credentials of current task are returned.
  259.  
  260.    RESULT
  261.        A getcredentials() function returns a valid pointer to structure
  262.        UserGroupCredentials on success and a null pointer if an error
  263.        occurs.
  264.  
  265.    ERRORS
  266.        [EINVAL]    An illegal task pointer was specified.
  267.  
  268.    BUGS
  269.        This function leave its result in an internal static object and
  270.        return a pointer to that object. Subsequent calls to this function
  271.        will modify the same object.
  272.  
  273.    SEE ALSO
  274.  
  275. usergroup.library/getgrent                         usergroup.library/getgrent
  276.  
  277.    NAME
  278.        getgrgid, getgrnam, getgrent, setgrent, endgrent
  279.         - group database operations
  280.  
  281.    SYNOPSIS
  282.        #include <grp.h>
  283.  
  284.        groupent = getgrgid(gid)
  285.           D0               D0
  286.        struct group *getgrgid(gid_t);
  287.  
  288.  
  289.        groupent = getgrnam(name)
  290.           D0                A1          
  291.        struct group *getgrnam(const char *);
  292.  
  293.  
  294.        groupent = getgrent()
  295.           D0
  296.        struct group *getgrent(void);
  297.  
  298.        setgrent()
  299.        void setgrent(void);
  300.  
  301.        endgrent()
  302.        void endgrent(void);
  303.  
  304.    FUNCTION
  305.        These functions operate on the group database via netinfo.device
  306.        interface. They provide a convenient unix-compatible interface to
  307.        the group unit of the netinfo.device.
  308.  
  309.        The local group database is stored in the file AmiTCP:db/group, its
  310.        format is described in netinfo.device/group.  The entry returned by
  311.        each reading function is defined by the structure group found in the
  312.        include file <grp.h>:
  313.  
  314.              struct group
  315.              {
  316.                char   *gr_name;              /* Group name.  */
  317.                char   *gr_passwd;            /* Password.    */
  318.                gid_t   gr_gid;               /* Group ID.    */
  319.                char  **gr_mem;               /* Member list. */
  320.               };
  321.  
  322.        The functions getgrnam() and getgrgid() search the group database
  323.        for the given group name pointed to by name or the group id pointed
  324.        to by gid, respectively, returning the first one encountered.
  325.        Identical group names or group gids may result in undefined
  326.        behavior.
  327.  
  328.        The getgrent() function sequentially reads the group database and is
  329.        intended for programs that wish to step through the complete list of
  330.        groups.
  331.  
  332.        All three routines will open the group unit of netinfo.device for
  333.        reading, if necesssary.
  334.  
  335.        The setgrent() function opens the group unit of netinfo.device.  The
  336.        endgrent() function closes the group unit of netinfo.device.  It is
  337.        recommended to call endgrent() if the program won't access group
  338.        database any more.
  339.  
  340.    RESULTS
  341.        The functions getgrent(), getgrnam(), and getgrgid(), return a
  342.        pointer to the group entry if successful; if the end of database is
  343.        reached or an error occurs a null pointer is returned.  The
  344.        functions endgrent() and setgrent() have no return value.
  345.  
  346.    ERRORS
  347.        [ENOENT] -- the netinfo.device could not be opened.
  348.  
  349.        Other netinfo.device IO errors can be retrieved by ug_GetErr().
  350.  
  351.    FILES
  352.        AmiTCP:db/group     The group database file
  353.  
  354.    SEE ALSO
  355.  
  356.        getpwnam(), netinfo.device/group
  357.  
  358.    HISTORY
  359.  
  360.        The functions getgrgid(), getgrnam(), getgrent(), setgrent() and
  361.        endgrent() appeared in Version 7 AT&T UNIX.
  362.  
  363.    BUGS
  364.  
  365.        These functions leave their results in an internal static object and
  366.        return a pointer to that object. Subsequent calls to the same
  367.        function will modify the same object. If you need re-entrant
  368.        operation, you can use directly the netinfo.device commands.
  369.  
  370.    COMPATIBILITY
  371.  
  372.        The BSD passwd database handling routines setgrfile() and
  373.        setgroupent() are fairly useless in a networked environment and they
  374.        are not implemented.
  375.  
  376. usergroup.library/getgroups                       usergroup.library/getgroups
  377.  
  378.    NAME
  379.        getgroups - get group access list
  380.  
  381.    SYNOPSIS
  382.        len = getgroups(gidsetlen, gidset[])
  383.        D0              D0         A0
  384.  
  385.        int getgroups(int, gid_t *);
  386.  
  387.    FUNCTION
  388.        Getgroups() gets the current group access list of the user process
  389.        and stores it in the array gidset. The parameter gidsetlen indicates
  390.        the number of entries that may be placed in gidset. The function
  391.        getgroups() returns the actual number of groups returned in gidset.
  392.        No more than NGROUPS, as defined in <libraries/usergroup.h>, will
  393.        ever be returned.
  394.  
  395.     RESULT
  396.        A successful call returns the number of groups in the group set.  A
  397.        value of -1 indicates that the argument gidsetlen is smaller than
  398.        the number of groups in the group set.
  399.  
  400.    ERRORS
  401.        [EINVAL] The argument gidsetlen is smaller than the number of
  402.                 groups in the group set.
  403.        [EFAULT] The argument gidset specifies an invalid address.
  404.  
  405.    SEE ALSO
  406.        setgroups(), initgroups(), getgid(), getegid()
  407.  
  408.    HISTORY
  409.        The getgroups function call appeared in 4.2BSD.
  410.  
  411. usergroup.library/getlastlog                     usergroup.library/getlastlog
  412.  
  413.    NAME
  414.        getlastlog - get lastlog database entry
  415.  
  416.    SYNOPSIS
  417.        #include <utmp.h>
  418.  
  419.        lastlog = getlastlog(uid)
  420.           D0                D0
  421.        struct lastlog *getlastlog(uid_t);
  422.  
  423.    FUNCTION
  424.  
  425.        The getlastlog() function search the lastlog database for the given
  426.        user id. There should be an lastlog entry for each user.  A lastlog
  427.        entry with ll_time being zero means that user has never logged in
  428.        this system.
  429.  
  430.        The entry returned by getlastlog is defined by the structure lastlog
  431.        found in the include file <utmp.h>:
  432.  
  433.              struct lastlog {                                              
  434.                long  ll_time;              /* the login time */            
  435.                uid_t ll_uid;               /* user ID */                   
  436.                char  ll_name[UT_NAMESIZE]; /* the login name */            
  437.                char  ll_line[UT_LINESIZE]; /* the name of login device */  
  438.                char  ll_host[UT_HOSTSIZE]; /* where the login originated */
  439.              };
  440.  
  441.    RESULTS
  442.        The function getlastlog() returns a pointer to the lastlog entry if
  443.        successful; if an error occurs a null pointer is returned.
  444.  
  445.    ERRORS
  446.        [ENOENT] -- no lastlog entry was found
  447.        [EINVAL] -- the user ID was illegal
  448.  
  449.    SEE ALSO
  450.        setlastlog()
  451.  
  452.    BUGS
  453.        The getlastlog() function leaves its result in an internal static
  454.        object and return a pointer to that object.  Subsequent calls to the
  455.        same function will modify the same object.
  456.  
  457.        Current implementation stores only the lastlog data of the latest
  458.        user logged in.
  459.  
  460. usergroup.library/getlogin                         usergroup.library/getlogin
  461.  
  462.    NAME
  463.        getlogin - get login name
  464.  
  465.    SYNOPSIS
  466.        name = getlogin()
  467.        D0
  468.  
  469.        char *getlogin(void)
  470.  
  471.    FUNCTION
  472.        The getlogin() routine returns the login name of the user associated
  473.        with the current session, as previously set by setlogin().  The name
  474.        is normally associated with a console at the time a session is
  475.        created, and is inherited by all processes descended from the login
  476.        process.  (This is true even if some of those processes assume
  477.        another user ID, for example when su is used.)
  478.  
  479.    INPUTS
  480.  
  481.    RESULT
  482.        name   - pointer to login name
  483.  
  484.    SEE ALSO
  485.        setlogin()
  486.  
  487. usergroup.library/getpass                           usergroup.library/getpass
  488.  
  489.    NAME
  490.        getpass - get a password
  491.  
  492.    SYNOPSIS
  493.        password = getpass(prompt)
  494.           D0                A1
  495.  
  496.        char *getpass(const char *);
  497.  
  498.    FUNCTION
  499.        The getpass() function displays a prompt to, and reads in a password
  500.        from "CONSOLE:".  If this device is not accessible, getpass()
  501.        displays the prompt on the standard error output and reads from the
  502.        standard input.
  503.  
  504.        The password may be up to _PASSWORD_LEN (currently 128) characters
  505.        in length.  Any additional characters and the terminating newline
  506.        character are discarded.
  507.  
  508.        Getpass turns off character echoing while reading the password.
  509.  
  510.    RESULT
  511.        password -  a pointer to the null terminated password
  512.  
  513.    FILES
  514.        Special device "CONSOLE:"
  515.  
  516.    SEE ALSO
  517.        crypt()
  518.  
  519.    HISTORY
  520.        A getpass function appeared in Version 7 AT&T UNIX.
  521.  
  522.    BUGS
  523.        The getpass function leaves its result in an internal static object
  524.        and returns a pointer to that object.  Subsequent calls to getpass
  525.        will modify the same object.
  526.  
  527.        The calling program should zero the password as soon as possible to
  528.        avoid leaving the cleartext password visible in the memory.
  529.  
  530. usergroup.library/getpwent                         usergroup.library/getpwent
  531.  
  532.   NAME
  533.        getpwent, getpwnam, getpwuid, setpwent, endpwent
  534.         - password database operations
  535.  
  536.   SYNOPSIS
  537.        #include <pwd.h>
  538.  
  539.        pw = getpwuid(uid)
  540.        D0            D0
  541.        struct passwd *getpwuid(uid_t);
  542.  
  543.  
  544.        pw = getpwnam(name)
  545.        D0             A1
  546.        struct passwd *getpwnam(const char *);
  547.  
  548.        pw = getpwent()
  549.        D0
  550.        struct passwd *getpwent(void);
  551.  
  552.        setpwent()
  553.        void setpwent(void);
  554.  
  555.        endpwent()
  556.        void endpwent(void);
  557.  
  558.   FUNCTION
  559.        These functions operate on the user database via netinfo.device
  560.        interface. They provide convenient unix-compatible interface to the
  561.        password unit of the netinfo.device.
  562.  
  563.        The local password database is stored in the file AmiTCP:db/passwd,
  564.        its format is described in netinfo.device/passwd.  The entry
  565.        returned by each reading function is defined by the structure passwd
  566.        found in the include file <pwd.h>:
  567.  
  568.               struct passwd
  569.               {
  570.                 char  *pw_name;         /* Username */
  571.                 char  *pw_passwd;       /* Encrypted password */
  572.                 pid_t  pw_uid;          /* User ID */
  573.                 gid_t  pw_gid;          /* Group ID */
  574.                 char  *pw_gecos;        /* Real name etc */
  575.                 char  *pw_dir;          /* Home directory */
  576.                 char  *pw_shell;        /* Shell */
  577.               };
  578.  
  579.        The functions getpwnam() and getpwuid() search the password database
  580.        for the given login name or user uid, respectively, always returning
  581.        the first one encountered.
  582.  
  583.        The getpwent() function sequentially reads the password database and
  584.        is intended for programs that wish to process the complete list of
  585.        users.
  586.  
  587.        All three routines will open the password unit of netinfo.device for
  588.        reading, if necesssary.
  589.  
  590.        The setpwent() function opens the password unit of netinfo.device.
  591.        The endpwent() function closes the password unit of netinfo.device.
  592.        It is recommended to call endpwent() if the program won't access
  593.        password database any more.
  594.  
  595.   RESULTS
  596.        The functions getpwent(), getpwnam() and getpwuid() return a valid
  597.        pointer to a passwd structure on success and a null pointer if end
  598.        of database is reached or an error occurs. The functions endpwent()
  599.        and setpwent() have no return value.
  600.  
  601.    ERRORS
  602.        [ENOENT] -- the netinfo.device could not be opened.
  603.  
  604.        Other netinfo.device IO errors can be retrieved by ug_GetErr().
  605.  
  606.   FILES
  607.        AmiTCP:db/passwd    The password database file
  608.  
  609.   SEE ALSO
  610.        getgrent(), netinfo.device/passwd
  611.  
  612.   HISTORY
  613.        The functions getpwent(), getpwnam(), getpwuid(), setpwent() and
  614.        endpwent() functions appeared in Version 7 AT&T UNIX.
  615.  
  616.   BUGS
  617.        These functions leave their results in an internal static object and
  618.        return a pointer to that object. Subsequent calls to these function
  619.        will modify the same object. If you need re-entrant operation, you
  620.        should use directly the netinfo.device.
  621.  
  622.   COMPATIBILITY
  623.        The BSD passwd database handling routines setpwfile() and
  624.        setpassent() are fairly useless in a networked environment and they
  625.        are not implemented.
  626.  
  627. usergroup.library/getspgrp                         usergroup.library/getspgrp
  628.  
  629.    NAME
  630.        getpgrp - get process group identification
  631.  
  632.    SYNOPSIS
  633.        #include <libraries/usergroup.h>
  634.  
  635.        sessionid = getpgrp()
  636.            D0
  637.        pid_t getpgrp(void);
  638.  
  639.    FUNCTION
  640.        The getpgrp() function returns the process group id for the current
  641.        process.  Currently, the process group ID is the same as the session
  642.        ID. The 0 is valid process group ID for console session.
  643.  
  644.    RESULTS
  645.        Upon successful completion, the value of the process group ID is
  646.        returned.  Otherwise, a value of -1 is returned and an error code is
  647.        stored to global errno location.
  648.  
  649.    ERRORS
  650.        [ESRCH]   The calling process don't belong to any process group.
  651.  
  652.    SEE ALSO
  653.         setsid(),  exec.library/FindTask()
  654.  
  655. usergroup.library/getuid                             usergroup.library/getuid
  656.  
  657.    NAME
  658.        getuid, geteuid - get user process identification
  659.        getgid, getegid - get group process identification
  660.  
  661.    SYNOPSIS
  662.        ruid = getuid()
  663.        D0
  664.  
  665.        uid_t getuid(void);
  666.  
  667.        euid = geteuid()
  668.        D0
  669.  
  670.        uid_t geteuid(void);
  671.  
  672.        rgid = getgid()
  673.        D0
  674.  
  675.        gid_t getgid(void);
  676.  
  677.        egid = getegid()
  678.        D0
  679.  
  680.        gid_t getegid(void);
  681.  
  682.    FUNCTION
  683.        The getuid() function returns the real user ID of the calling
  684.        process, geteuid() returns the effective user ID of the calling
  685.        process.
  686.  
  687.        The getgid() function returns the real group ID of the calling
  688.        process, getegid() returns the effective group ID of the calling
  689.        process.
  690.  
  691.        The real user ID and real group ID is specified at login time.
  692.  
  693.        The real ID is the ID of the user who invoked the program.  As the
  694.        effective user and gourp ID gives the process additional permissions
  695.        during the execution of `set-user-ID' or `set-group-ID' mode
  696.        programs, functions getgid() and getuid () are used to determine the
  697.        real-ids of the calling process.
  698.  
  699.    RESULT
  700.        The getuid(), geteuid(), getgid(), and getegid() functions are
  701.        always successful, and no return value is reserved to indicate an
  702.        error.
  703.  
  704.    NOTES
  705.        Any task can call these functions
  706.  
  707.    SEE ALSO
  708.        getgroups(), setuid(), setreuid(), setgid(), setregid(), setgroups()
  709.  
  710. usergroup.library/getumask                         usergroup.library/getumask
  711.  
  712.    NAME
  713.        getumask - get file creation mode mask
  714.  
  715.    SYNOPSIS
  716.        #include <sys/stat.h>
  717.  
  718.        oldmask = getumask()
  719.        D0
  720.  
  721.        mode_t getumask(void);
  722.  
  723.    FUNCTION
  724.        The getumask() routine sets the process's file mode creation mask to
  725.        numask and returns the previous value of the mask.  The 9 low-order
  726.        access permission bits of numask are used by Unix-compatible
  727.        filesystems, for examble by NFS, to turn off corresponding bits
  728.        requested in file mode.
  729.  
  730.    RESULT
  731.        The value of the file mode mask is returned by the call.
  732.  
  733.    ERRORS
  734.        The getumask() function is always successful.
  735.  
  736.    SEE ALSO
  737.        umask()
  738. usergroup.library/getutent                         usergroup.library/getutent
  739.  
  740.    NAME
  741.        getutsid, getutent, setutent, endutent - utmp database operations
  742.  
  743.    SYNOPSIS
  744.        #include <utmp.h>
  745.  
  746.        utmpent = getutsid(sid)
  747.           D0              D0
  748.        struct utmp *getutsid(long);
  749.  
  750.        utmpent = getutent()
  751.           D0
  752.        struct utmp *getutent(void);
  753.  
  754.        setutent()
  755.        void setutent(void);
  756.  
  757.        endutent()
  758.        void endutent(void);
  759.  
  760.    FUNCTION
  761.        These functions operate on the utmp database.  There is an utmp
  762.        entry for each active session.  A session is started with login
  763.        command and finished with logout command.
  764.  
  765.        The entry returned by each reading function is defined by the
  766.        structure utmp found in the include file <utmp.h>:
  767.  
  768.            struct utmp {
  769.              long    ut_time;              /* the login time */
  770.              long    ut_sid;               /* session ID */
  771.              char    ut_name[UT_NAMESIZE]; /* the login name */
  772.              char    ut_line[UT_LINESIZE]; /* the name of login device */
  773.              char    ut_host[UT_HOSTSIZE]; /* where the login originated */
  774.            };
  775.  
  776.        The getutsid() function search the utmp database for the given
  777.        session id, returning the first one encountered.  The getutent()
  778.        function sequentially reads the utmp database.  Both functions also
  779.        open the utmp database, if necessary.
  780.  
  781.        The setutent() function opens the utmp database.  The
  782.        endutent() function closes the utmp database.  It is
  783.        recommended to call endutent() if the program won't access
  784.        utmp database any more.
  785.  
  786.    RESULTS
  787.        The functions getutsid() and getutent() return a pointer to the utmp
  788.        entry if successful; if the end of database is reached or an error
  789.        occurs a null pointer is returned.  The functions endutent() and
  790.        setutent() have no return value.
  791.  
  792.    ERRORS
  793.        [ENOENT] -- no utmp entries were available.
  794.  
  795.    SEE ALSO
  796.  
  797.    BUGS
  798.        The getutent() and getutsid() function leave their result in an
  799.        internal static object and return a pointer to that object.
  800.        Subsequent calls to the same function will modify the same object.
  801.  
  802.        Current implementation allows only one user to be logged in
  803.        concurrently.
  804.  
  805. usergroup.library/initgroups                     usergroup.library/initgroups
  806.  
  807.    NAME
  808.        initgroups - initialize group access list
  809.  
  810.    SYNOPSIS
  811.        error = initgroups(name, basegid)
  812.         D0                 A0     D0
  813.  
  814.        int initgroups(const char *, gid_t);
  815.  
  816.    FUNCTION
  817.        The initgroups() function reads through the group file and sets up,
  818.        the group access list for the user specified in name. The basegid is
  819.        automatically included in the groups list.  Typically this value is
  820.        given as the group number from the password file.
  821.  
  822.     RESULT
  823.        The initgroups() function returns -1 if the process has got no
  824.        necessary privileges, zero if the call is succesful.
  825.  
  826.     FILES
  827.         AmiTCP:db/group
  828.  
  829.     SEE ALSO
  830.         setgroups()
  831.  
  832.     HISTORY
  833.         The initgroups function appeared in 4.2BSD.
  834.  
  835. usergroup.library/MU2UG                               usergroup.library/MU2UG
  836.  
  837.    NAME
  838.        MU2ID - macro converting MultiUser id to usergroup id
  839.        ID2MU - macro converting usergroup id to MultiUser id
  840.  
  841.    SYNOPSIS
  842.        ug_id = MU2ID(mu_id)
  843.  
  844.        mu_id = ID2MU(ug_id)
  845.  
  846.    FUNCTION
  847.        These macros are used to convert between different user ID
  848.        formats.  The mu_id is in the format used by MultiUser filesystem
  849.        and multiuser.library.  The ug_id is the format used by Unix and
  850.        usergroup.library.
  851.  
  852.        Most of the id values are identical in usergroup.library and
  853.        multiuser.library. However, these two exceptions have values as
  854.        follows:
  855.  
  856.                    usergroup.library  multiuser.library
  857.        super-user          0              65535
  858.        nobody             -2                  0
  859.  
  860.    INPUTS AND RESULTS
  861.        mu_id    - user ID in MultiUser format.
  862.        ug_id    - user ID in usergroup format.
  863.  
  864.    BUGS
  865.        The usergroup id values that won't fit into UWORD are truncated.
  866.  
  867.    SEE ALSO
  868. usergroup.library/setgroups                       usergroup.library/setgroups
  869.  
  870.    NAME
  871.        setgroups - set group access list
  872.  
  873.    SYNOPSIS
  874.        success = setgroups(ngroups, gidset)
  875.        D0                  D0       A0
  876.  
  877.        int setgroups(int, const gid_t *);
  878.  
  879.    FUNCTION
  880.        Setgroups() sets the group access list of the current user process
  881.        according to the array gidset. The parameter ngroups indicates the
  882.        number of entries in the array and must be no more than NGROUPS, as
  883.        defined in <libraries/usergroup.h>.
  884.  
  885.        Only the super-user may set new groups. The super-user can not
  886.        set illegal groups (-1).
  887.  
  888.    RESULT
  889.        A 0 value is returned on success, -1 on error, with an error
  890.        code stored in errno and available with ug_GetErr() function.
  891.  
  892.    ERRORS
  893.        [EINVAL]    An illegal group id was specified.
  894.        [EPERM]     The caller has got no necessary privileges.
  895.        [EFAULT]    The address specified for gidset is illegal.
  896.  
  897.    NOTES
  898.        Any task can call this function.
  899.  
  900.    SEE ALSO
  901.        getgroups(), initgroups()
  902.  
  903. usergroup.library/setlastlog                     usergroup.library/setlastlog
  904.  
  905.    NAME
  906.        setlastlog - login an user
  907.  
  908.    SYNOPSIS
  909.        #include <utmp.h>
  910.  
  911.        lastlogin = setlastlog(uid, name, console, host)
  912.  
  913.        struct lastlog setlastlog(uid_t, char *, char *, char *);
  914.  
  915.    FUNCTION
  916.        The setlastlog function is used to register user logging in.  Each
  917.        time a user is logging in, the function setlastlog() should be
  918.        called to register that event.
  919.  
  920.    INPUTS
  921.        uid     -- the uid of user logging in
  922.        name    -- the user login name
  923.        console -- the console handler name (from ug_GetConsole())
  924.        host    -- the host which the user is logging in from
  925.  
  926.    RESULTS
  927.        The setlastlog() function returns an success indicator, 0 if the
  928.        call was successful, -1 otherwise.  The error code is set if an
  929.        error occurs.
  930.  
  931.    ERRORS
  932.        The setlastlog() can have following error codes:
  933.        [EFAULT] -- the utmp entry cannot be accessed
  934.        [ENOMEM] -- the memory has been exhausted
  935.        [ENOENT] -- cannot access utmp database
  936.  
  937.    BUGS
  938.        Current implementation stores only the lastlog data of the latest
  939.        user logged in.
  940.  
  941.    FILES
  942.  
  943.    SEE ALSO
  944.        getutent(), getlastlog()
  945.  
  946. usergroup.library/setlogin                         usergroup.library/setlogin
  947.  
  948.    NAME
  949.        setlogin - set login name
  950.  
  951.    SYNOPSIS
  952.        success = setlogin(name)
  953.        D0                 A1
  954.  
  955.        int setlogin(const char *);
  956.  
  957.    FUNCTION
  958.        The function setlogin() sets the login name of the user associated
  959.        with the current session to name. This call is restricted to the
  960.        super-user, and is normally used only when a new session is being
  961.        created on behalf of the named user (for example, at login time, or
  962.        when a remote shell is invoked).
  963.  
  964.    INPUTS
  965.        name     - Buffer to hold login name
  966.  
  967.    RESULT
  968.        If a call to setlogin() succeeds, a value of 0 is returned.  If
  969.        setlogin() fails, a value of -1 is returned and an error code is
  970.        placed into global errno location.
  971.  
  972.    ERRORS
  973.        [EPERM]  - The caller has got no necessary privileges.
  974.        [EFAULT] - The name parameter gave an invalid address.
  975.        [EINVAL] - The name parameter pointed to a string that was too long.
  976.                   Login names are limited to MAXLOGNAME (from <sys/param.h>)
  977.                   characters, currently 16.
  978.  
  979.    BUGS
  980.  
  981.    SEE ALSO
  982.        getlogin()
  983.  
  984. usergroup.library/setsid                             usergroup.library/setsid
  985.  
  986.    NAME
  987.        setsid - create a new session
  988.  
  989.    SYNOPSIS
  990.        #include <unistd.h>
  991.  
  992.        sessionid = setsid()
  993.            D0
  994.        pid_t setsid(void);
  995.  
  996.    FUNCTION
  997.        The setsid() function creates a new session when the calling
  998.        process is not a process group leader.  The calling process
  999.        then becomes the session leader of this session and the only
  1000.        process in the new session.
  1001.  
  1002.    RESULTS
  1003.        Upon successful completion, the value of the new session ID is
  1004.        returned.  Otherwise, a value of -1 is returned and an error
  1005.            code is  stored to global errno location.
  1006.  
  1007.    ERRORS
  1008.        [EPERM]   The calling process is already a session leader.
  1009.  
  1010.    SEE ALSO
  1011.         getpgrp()
  1012.  
  1013. usergroup.library/setuid                             usergroup.library/setuid
  1014.  
  1015.    NAME
  1016.        setuid, setreuid - set real and effective user ID's
  1017.        setgid, setregid - set real and effective group ID's
  1018.  
  1019.    SYNOPSIS
  1020.        success = setuid(uid)
  1021.        D0               D0
  1022.  
  1023.        int setuid(uid_t);
  1024.  
  1025.        success = setreuid(ruid, euid);
  1026.        D0                 D0    D1
  1027.  
  1028.        int setreuid(uid_t, uid_t);
  1029.  
  1030.        success = setgid(gid)
  1031.        D0               D0
  1032.  
  1033.        int setgid(gid_t);
  1034.  
  1035.        success = setregid(ruid, euid)
  1036.        D0                 D0    D1
  1037.  
  1038.        int setregid(gid_t ruid, gid_t euid);
  1039.  
  1040.    FUNCTION
  1041.        The real and effective ID's of the current process are set according
  1042.        to the arguments.  If ruid or euid is -1, the current uid is filled
  1043.        in by the system.  Unprivileged users may change the real ID to the
  1044.        effective ID and vice-versa; only the super-user may make other
  1045.        changes.
  1046.  
  1047.    RETURN VALUES
  1048.        Upon successful completion, a value of 0 is returned. Otherwise, a
  1049.        value of -1 is returned and errno is set to indicate the error.
  1050.  
  1051.    ERRORS
  1052.        [EPERM]  The current process is not the super-user and a change
  1053.                 other than changing the effective id to the real id was
  1054.                 specified.
  1055.  
  1056.    SEE ALSO
  1057.        getuid(), getgid(), geteuid(), getegid()
  1058.  
  1059.    NOTES
  1060.        Any task can call these functions.
  1061.  
  1062.    HISTORY
  1063.        A setuid() and setgid() function calls appeared in Version 6 AT&T
  1064.        UNIX.  The setreuid() and setregid() function calls appeared in
  1065.        4.2BSD.
  1066.  
  1067. usergroup.library/ug_GetConsoleName       usergroup.library/ug_GetConsoleName
  1068.  
  1069.    NAME
  1070.        ug_GetConsoleName --- Get Console Identifier
  1071.  
  1072.    SYNOPSIS
  1073.        name = ug_GetConsoleName(fh, buffer, size)
  1074.        D0                    D0  A0      D1
  1075.  
  1076.        UBYTE * ug_GetConsoleName(BPTR, UBYTE *, ULONG)
  1077.  
  1078.    FUNCTION
  1079.        Get a unique printable identifier for the interactive filehandle.
  1080.        This identifier is usually the task name of handler concatenated
  1081.        with message port address.
  1082.  
  1083.    INPUTS
  1084.        fh     - An interactive filehandle
  1085.        buffer - Buffer to hold console identifier
  1086.        size   - Number of bytes in buffer.
  1087.  
  1088.    RESULT
  1089.        name - If call is successful, pointer to buffer. NULL if
  1090.               error.
  1091.  
  1092.    BUGS
  1093.        May not get the proprer console name for all different console
  1094.        handlers.
  1095.  
  1096.    SEE ALSO
  1097.        dos.library/GetConsoleTask()
  1098.  
  1099. usergroup.library/ug_GetErr                       usergroup.library/ug_GetErr
  1100.  
  1101.    NAME
  1102.        ug_GetErr - get current error code
  1103.  
  1104.    SYNOPSIS
  1105.        error = ug_GetErr(void)
  1106.         D0
  1107.  
  1108.        int ug_GetErr(void)
  1109.  
  1110.    FUNCTION
  1111.        Most usergroup.library functions return -1 to indicate an error.
  1112.        When this happens (or whatever the defined error return for the
  1113.        routine) this routine may be called to determine more information.
  1114.        The default startup function will redirect the error codes also into
  1115.        the global variable `errno'.
  1116.  
  1117.        Note: there is no guarantee as to the value returned from ug_GetErr()
  1118.        after a successful operation.
  1119.  
  1120.    RESULTS
  1121.        error - error code
  1122.  
  1123.    SEE ALSO
  1124.        ug_StrError(), ug_SetupContextTags(), dos.library/IoErr()
  1125.  
  1126. usergroup.library/ug_GetSalt                     usergroup.library/ug_GetSalt
  1127.  
  1128.    NAME
  1129.        ug_GetSalt - generate password encryption setting for an user
  1130.  
  1131.    SYNOPSIS
  1132.        setting = ug_GetSalt(passwd, buffer, size);
  1133.          D0                   A0      A1     D0
  1134.  
  1135.        UBYTE *ug_GetSalt(const struct passwd *, UBYTE *, ULONG);
  1136.  
  1137.    FUNCTION
  1138.        This function generates a setting parameter, which is used to
  1139.        configure the password encryption process.  If an old entry exists,
  1140.        the new salt depends on it.
  1141.  
  1142.        The particular salt format depends on the system security level.
  1143.  
  1144.    INPUTS
  1145.        passwd - the old passwd entry for the user, or NULL if there is none.
  1146.  
  1147.        buffer - address of character array, which the new salt is stored
  1148.                 in.
  1149.  
  1150.        size   - the number of bytes in the buffer. The buffer should be at
  1151.                 least 12 bytes long. 
  1152.  
  1153.    RETURN VALUE
  1154.        Pointer to the buffer, or NULL if the buffer is too small.
  1155.  
  1156.    NOTE
  1157.        By default the Version 7 UNIX compatible setting is generated.
  1158.  
  1159.    SEE ALSO
  1160.       crypt()
  1161.  
  1162. usergroup.library/ug_OnConsole                 usergroup.library/ug_OnConsole
  1163.  
  1164.    NAME
  1165.        ug_OnConsole - check whether session is on local console
  1166.  
  1167.    SYNOPSIS
  1168.        result = ug_OnConsole(void)
  1169.        D0
  1170.  
  1171.        BOOL ug_OnConsole(void)
  1172.  
  1173.    FUNCTION
  1174.        Check if the user is logged on local console.
  1175.  
  1176.    RESULT
  1177.        result - 1 if the user is on console,
  1178.                 0 otherwise.
  1179.  
  1180.    BUGS
  1181.  
  1182.        Currently checking is done depending on the process window pointer.
  1183.  
  1184.    SEE ALSO
  1185.  
  1186. usergroup.library/ug_SetupContextTags   usergroup.library/ug_SetupContextTags
  1187.  
  1188.    NAME
  1189.        ug_SetupContextTagList - Set up the caller context
  1190.        ug_SetupContextTags    -  varargs stub for ug_SetupContextTagList
  1191.  
  1192.    SYNOPSIS
  1193.        success = ug_SetupContextTagList(taglist)
  1194.          D0                               A1
  1195.  
  1196.        ULONG ug_SetupContextTagList(struct TagItem *);
  1197.  
  1198.        success = ug_SetupContextTags(...)
  1199.  
  1200.        ULONG ug_SetupContextTags(LONG tag, ...);
  1201.  
  1202.  
  1203.    FUNCTION
  1204.        The function ug_SetupContextTags() will prepare the library caller
  1205.        context.
  1206.  
  1207.    INPUTS
  1208.        taglist - pointer to taglist
  1209.  
  1210.        Currently, there are defined tags as follows:
  1211.  
  1212.        UGT_ERRNOPTR  - gives the pointer to the errno variable.  The error
  1213.                        variable is redirected to the scope of the task.  If
  1214.                        the pointer is NULL, no redirection is done anymore.
  1215.  
  1216.        UGT_ERRNOSIZE - specifies the size of the errno variable. Legal
  1217.                        values are 1, 2 and 4.  The UGT_ERRNOSIZE must be
  1218.                        given with same call if the UGT_ERRNOPTR is given a
  1219.                        non-NULL value.
  1220.  
  1221.        UGT_INTRMASK  - specifies the interrupt signal mask. All blocking
  1222.                        library calls will be interrrupted when a signal in
  1223.                        the break mask is received. The signals in the
  1224.                        `mask' are not cleared when a library call is
  1225.                        interrupted.  The signals in INTRMASK should be
  1226.                        allocated in the context of the owning task.
  1227.  
  1228.        UGT_OWNER     - changes the owner of this library instance.  The
  1229.                        UGT_OWNET tagData must be a valid task pointer or
  1230.                        NULL. If the pointer is NULL, the library will have
  1231.                        no owner and any task can become owner by calling
  1232.                        ug_SetupContextTagList(UGT_OWNER, FindTask(NULL),
  1233.                        TAG_END) ; 
  1234.  
  1235.                        Most of the library calls are allowed only for the
  1236.                        owner of library.  Only the owner can CloseLibrary()
  1237.                        this library.
  1238.  
  1239.    RESULT
  1240.        If the call is successfull, value of 0 is returned. Otherwise the
  1241.        value -1 is returned. Old context is cleared, if an error occurs.
  1242.        The error code can be retrieved with function ug_GetErr().
  1243.  
  1244.    ERRORS
  1245.        [EINVAL]    An illegal input value was specified.
  1246.  
  1247.    BUGS
  1248.        Strange and unusual things will happen if the signal allocated for
  1249.        the use of the library is included in the mask.
  1250.  
  1251.    SEE ALSO
  1252.        ug_GetErr(), --background--
  1253.  
  1254. usergroup.library/ug_StrError                   usergroup.library/ug_StrError
  1255.  
  1256.    NAME
  1257.        ug_StrError - Return the text associated with error code
  1258.  
  1259.    SYNOPSIS
  1260.        text = ug_StrError(code)
  1261.         D0                   D1
  1262.  
  1263.        const char *ug_StrError(LONG);
  1264.  
  1265.    FUNCTION
  1266.        The strerror() function maps the error number specified by the
  1267.        errnum parameter to a language-dependent error message string, and
  1268.        returns a pointer to the string.  The string pointed to by the
  1269.        return value should not be modified by the program, but may be
  1270.        overwritten by a subsequent call to this function.
  1271.  
  1272.    INPUTS
  1273.        code - error code returned by ug_GetErr() function.
  1274.  
  1275.    RESULT
  1276.        text - text associated with the error code.
  1277.  
  1278.    NOTES
  1279.        The current implementation will understands also the negative IO
  1280.        error codes.
  1281.  
  1282.    BUGS
  1283.        Currently only language available is English.
  1284.  
  1285.    SEE ALSO
  1286.        ug_GetErr()
  1287.  
  1288. usergroup.library/umask                               usergroup.library/umask
  1289.  
  1290.    NAME
  1291.        umask - set file creation mode mask
  1292.  
  1293.    SYNOPSIS
  1294.        #include <sys/stat.h>
  1295.  
  1296.        oldmask = umask(newmask)
  1297.        D0              D0
  1298.  
  1299.        mode_t umask(mode_t);
  1300.  
  1301.    FUNCTION
  1302.        The umask() routine sets the process's file mode creation mask to
  1303.        numask and returns the previous value of the mask.  The 9 low-order
  1304.        access permission bits of numask are used by Unix-compatible
  1305.        filesystems, for examble by NFS, to turn off corresponding bits
  1306.        requested in file mode.  This clearing allows each user to restrict
  1307.        the default access to his files.
  1308.  
  1309.        The default mask value is 022 (write access for owner only).  Child
  1310.        processes should inherit the mask of the calling process.
  1311.  
  1312.    RESULT
  1313.        The previous value of the file mode mask is returned by the call.
  1314.  
  1315.    ERRORS
  1316.        The umask() function is always successful.
  1317.  
  1318.    SEE ALSO
  1319.        getumask()
  1320.  
  1321.